package config

import (
	"errors"

	"github.com/CIPFZ/collector/internal/vars"
	"github.com/CIPFZ/collector/pkg/exception"

	"github.com/spf13/viper"
)

// LoadConfig 加载配置文件
func LoadConfig() (*Config, error) {
	viper.SetConfigName(vars.ConfigName)
	viper.SetConfigType(vars.ConfigType)
	viper.AddConfigPath(vars.ConfigPath)

	// 环境变量配置
	viper.SetEnvPrefix(vars.EnvPrefix)
	viper.AutomaticEnv()

	// 读取配置文件
	if err := viper.ReadInConfig(); err != nil {
		var configFileNotFoundError viper.ConfigFileNotFoundError
		if !errors.As(err, &configFileNotFoundError) {
			return nil, exception.NewConfigLoadError("failed to read config file", err)
		}
		// 配置文件不存在时使用默认配置
		setDefaults()
	}

	var config Config
	if err := viper.Unmarshal(&config); err != nil {
		return nil, exception.NewConfigLoadError("failed to unmarshal config", err)
	}

	return &config, nil
}

// LoadConfigFromFile 从指定文件加载配置
func LoadConfigFromFile(filepath string) (*Config, error) {
	viper.SetConfigFile(filepath)

	if err := viper.ReadInConfig(); err != nil {
		return nil, exception.NewConfigLoadError("failed to read config file: "+filepath, err)
	}

	var config Config
	if err := viper.Unmarshal(&config); err != nil {
		return nil, exception.NewConfigLoadError("failed to unmarshal config", err)
	}

	return &config, nil
}

// setDefaults 设置默认配置值
func setDefaults() {
	// App 默认配置
	viper.SetDefault("app.name", "collector")
	viper.SetDefault("app.version", "1.0.0")
	viper.SetDefault("app.debug", false)

	// Logger 默认配置
	viper.SetDefault("logger.level", "info")
	viper.SetDefault("logger.format", "console")
	viper.SetDefault("logger.output", "stdout")
	viper.SetDefault("logger.file", "collector.log")

	// Progress 默认配置
	viper.SetDefault("progress.enabled", true)
	viper.SetDefault("progress.style", "default")
	viper.SetDefault("progress.width", 50)
	viper.SetDefault("progress.show_percentage", true)
	viper.SetDefault("progress.show_count", true)

	// Pool 默认配置
	viper.SetDefault("pool.size", 10)
	viper.SetDefault("pool.nonblocking", false)
	viper.SetDefault("pool.max_blocking_tasks", 0)

	// System 默认配置
	viper.SetDefault("system.enabled", true)
	viper.SetDefault("system.modules", []string{"cpu", "memory", "disk"})

	// Logs 默认配置
	viper.SetDefault("logs.enabled", false)

	// Commands 默认配置
	viper.SetDefault("commands.enabled", false)
	viper.SetDefault("commands.timeout", "30s")

	// Output 默认配置
	viper.SetDefault("output.format", "json")
	viper.SetDefault("output.file", "results.json")
	viper.SetDefault("output.dir", "./results")
	viper.SetDefault("output.compress", false)
}
